package k1_exercise;

import java.util.Scanner;

public class Array_yangHuiTriangle {
    /**
     * 1
     * 1 1
     * 1 2 1
     * 1 3 3 1
     * 1 4 6 4 1
     * ……
     * 杨辉三角的特点：
     * 	1.第i 行有i 个元素
     * 	2.每一行的第一个元素和最后一个元素都为1
     * 	3.除了1 之外，每个元素的值，都等于上一行同位置的元素以及前一个元素的和。
     */
    public static void main(String[] args) {

        //从控制台接收杨辉三角形要输出的行数
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入杨辉三角形的行数：");
        int lineCount = scanner.nextInt();

        //创建一个二维数组，用来接收杨辉三角形，每行都是一个一位数组，所有行组成了二维数组
        int[][] triangle = new int[lineCount][];

        //这层循环表示的是循环行，每执行一次，封装一个当前行的一位数组，并添加到二维数组中
        for (int lineNumberIndex = 0; lineNumberIndex < triangle.length; lineNumberIndex++) {
            //创建第 lineNumberIndex+1 行的一维数组
            int[] line = new int[lineNumberIndex+1];

            //因为第一行只有一个数字，比较特殊，直接赋值即可
            if(lineNumberIndex==0){
                line[0] = 1;
            }else{
                //从第二行往后，按照规律进行赋值
                //首先每行的第一个数字和最后一个数字都是1
                line[0] = 1;
                line[lineNumberIndex] = 1;

                //对每行中除了第一位和最后一位以外的列进行赋值
                for (int columnNumberIndex = 1; columnNumberIndex < line.length-1 ; columnNumberIndex++) {
                    //计算此位置的上一行的当前位置的值
                    int lastLineCurrentColumn = triangle[lineNumberIndex-1][columnNumberIndex];
                    //计算此位置的上一行的前一个位置的值
                    int lastLineLastColumn = triangle[lineNumberIndex-1][columnNumberIndex-1];
                    //此位置的值=上一行的当前位置的值+上一行的前一个位置的值
                    line[columnNumberIndex] = lastLineCurrentColumn + lastLineLastColumn;
                }
            }
            //将封装后的此行的一维数组添加到整体的二维数组中
            triangle[lineNumberIndex] = line;
        }

        for (int[] line : triangle) {
            for (int column : line) {
                System.out.print(column+" ");
            }
            System.out.println();
        }

    }
}
